const fp = require("loadsh/fp")
const {Maybe, Container} = require('./support')
let maybe = Maybe.of([5,6,1])

/**
 * 
 * 练习1.   如果这个ex1 赋值的箭头函数不写传递参数怎么实现。我实在是实现不了不传递参数的方式。 
 */
let ex1 = (value) => {  //这个参数value是我自己加上去的。 不加这个参数怎么实现。不会给maybe.map传值的时候传递ex1()吧。 求老师指导
    return fp.curry(fp.map)(fp.curry(fp.add)(1))(value);
}
// 难道ex1写成这样?
ex1 = ()=>{
    return maybe.map(fp.curry(fp.map)(fp.curry(fp.add)(1)));
}
console.log(ex1());

/**
 * 练习2.
 */
let xs = Container.of(['do', 'ray', 'me', 'fa', 'so', 'la', 'ti', 'do'])
let ex2 = (value)=>{        //一样的道理，这个形参vlaue是我加的。不加这个形参，怎么也不行，什么闭包，绑定this 或者使用arguments都没有成功
        return fp.first(value)
}
// console.log(xs.map(ex2));
//难道ex2 也写成下面这样？
ex2 = () => {
    return xs.map(fp.first)
}
console.log(ex2());

/**
 * 练习3.
 */
let safeProp = fp.curry(function(x,o){
    console.log(x,o);
    return Maybe.of(o[x]);
})
let user = {id:2, name:"Albert"}
let ex3 = ()=>{
   return safeProp('name',user).map(fp.first);
}

/**
 * 练习4
 */
let ex4 = function(n){
    return Maybe.of(n).map(parseInt);
}
console.log(ex4('12'));